#include "queue.h"
#include <string.h>	/* memcpy */
#include <stdio.h>	/* printf */

#define BUFFER_COUNT		8	/* 缓存总个数 */
#define BUFFER_UNIT_SIZE	32	/* 单个缓存的最大长度 */

/* 单个缓存元素 */
typedef struct _queue_buf {
	queue_t queue;
	char *buf;
} queue_buf_t;

static char g_buf[BUFFER_COUNT][BUFFER_UNIT_SIZE];	/* 开辟的缓存空间 */
static queue_buf_t queue_buf[BUFFER_COUNT];	/* 所有缓存节点 */

int main()
{
	int i;
	queue_entry_t queue_entry;	/* 整个缓存队列的入口 */

	queue_entry_init(&queue_entry);	/* 初始化队列入口 */

	/* 初始化，将所有缓存放到已释放队列中 */
	for (i = 0; i < BUFFER_COUNT; i++) {
		queue_init(&queue_buf[i].queue);	/* 初始化每个队列元素 */
		queue_buf[i].buf = g_buf[i];
		queue_buf[i].queue.queue_entry = &queue_entry;
		queue_free(&queue_buf[i].queue);	/* 将所有缓存加入到已释放队列 */
	}

	/* 读取所有空闲缓存，赋值后存到已使用队列中 */
	i = 0;
	printf("\nput:\n");
	while (1) {
		queue_t *pq = queue_alloc(&queue_entry);
		if (!pq)
			break;
		queue_buf_t *pqbuf = container_of(pq, queue_buf_t, queue);
		memcpy(pqbuf->buf, &i, sizeof(int));	/* 赋值，递增序列 */
		printf("%d\n", i);
		i++;
		queue_put(NULL, pq, QUEUE_USED);
	}

	/* 读取所有已使用缓存，将里面内容打印出来，然后用完后重新放回已释放队列 */
	i = 0;
	printf("\nget:\n");
	while (1) {
		queue_t *pq = queue_get(&queue_entry, QUEUE_USED);
		if (!pq)
			break;
		queue_buf_t *pqbuf = container_of(pq, queue_buf_t, queue);
		printf("%d: %d\n", i, *(int *)pqbuf->buf);	/* 打印值，看是不是递增序列 */
		i++;
		queue_free(pq);
	}

	return 0;
}